// ^处权限拦截 导航守卫 路由守卫  router
import router from '@/router' // 引入路由实例
import store from '@/store' // 引入vuex store实例

// 路由全局前置守卫
router.beforeEach(async(to, from, next) => {
  const token = store.state.user.token
  // 定义白名单,所有不受权限控制的页面
  const nextTo = ['/login', '/404']
  if (token) {
    // ^如果有token,则代表已经登录了
    // 有token,再继续判断是不是去登录页，是就返回首页，不是就放行
    if (to.path === '/login') return next('/')
    // 这里需要判断是否是第一次进来，
    if (store.state.user.userInfo.id) {
      // 不是第一次进来
      // 直接放行
      next()
    } else {
      // 可以在这里获取用户的资料，也可以在navBar内，在这里写可以配合之后的一些业务逻辑
      // async 函数所return的内容 用 await就可以接收到
      const { roles } = await store.dispatch('user/getUserInfo')
      // console.log(roles)
      store.dispatch('permission/filterRouter', roles)
      // console.log(to.path)
      // 进门了，但是进门之后我要去的地方的路还没有铺好，直接走，掉坑里，多做一次跳转，再从门外往里进一次，跳转之前 把路铺好，再次进来的时候，路就铺好了
      // 第一次的进来的时候才需要next(to.path)
      // 这里有个非常容易出问题的位置，当我们判断用户是否已经添加路由的前后，不能都是用**next()**，在添加路由之后应该使用 **next(to.path)**， 否则会使刷新页面之后 权限消失，这属于一个vue-router的**已知缺陷**
      next(to.path)
    }
  } else {
    // ^如果没有token,则代表没有登录
    if (nextTo.includes(to.path)) {
      // 如果找到了,表示在白名单里面,放行
      next()
    } else {
      // 不在白名单里面就跳到登录页
      next('/login')
    }
  }
})
